Давайте создадим приложение SDI с помощью AppWizard и пусть оно назвается GraphWork. Теперь наша задача считать файл BMP c диска и отобразить на экране. Создаем пункт меню:

Теперь привяжем этот пункт меню к функции в классе документа:
void CGraphWorkDoc::OnInsertImage()
{
......
}
Нам в классе документа нужно объявить две переменные - дескриптор изображения HBITMAP и класс CBitmap.
class CGraphWorkDoc : public CDocument
{
......
// Implementation
public:
HBITMAP hBitmap;
CBitmap m_bmpBitmap;
virtual ~CGraphWorkDoc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
......
};
Вот теперь можно и функцию написать:
void CGraphWorkDoc::OnInsertImage()
{
CString m_sFileName;
CFileDialog fileDialog(TRUE,NULL,"*.bmp");
int result = fileDialog.DoModal();
if (result==IDOK)
{
m_sFileName=fileDialog.GetPathName();
HBITMAP hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
m_sFileName, IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
m_bmpBitmap.Detach();
m_bmpBitmap.Attach(hBitmap);
UpdateAllViews(NULL);
}
}
Что написано ? Узнать имя BMP файла для начала. Потом прочитать его, используя LoadImage(), и связать с классом CBitmap, а затем обновить вид.
Рисовать мы будем его в функции OnDraw() вида:
void CGraphWorkView::OnDraw(CDC* pDC)
{
CGraphWorkDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC dcTemp;
dcTemp.CreateCompatibleDC(pDC);
dcTemp.SelectObject(pDoc->m_bmpBitmap);
BITMAP bm;
if (pDoc->m_bmpBitmap.GetSafeHandle()!=NULL)
pDoc->m_bmpBitmap.GetBitmap(&bm);
pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcTemp,0,0,SRCCOPY);
}
Здесь мы создаем контекст памяти и выбираем в этот контекст объект CBitmap, потом получаем информацию о размере изображения и выводим на экран BitBlt(). BMP файлы есть, например, в каталоге Windows. Оттуда я и взял файл установка.bmp.
